/********************************************************************************
 * 配置说明：
 *
 * 1. 外部模板URL配置：
 *    - 在 fetchTemplatesFromExternalUrl 函数中，将示例URL替换为您的实际URL
 *    - 推荐使用：Gitee、GitHub Gist、码云或其他支持直接访问JSON文件的公共服务
 *    - 示例：https://gitee.com/yourusername/repo/raw/main/hotel-templates.json
 *    - 示例：https://gist.githubusercontent.com/yourusername/gist-id/raw/hotel-templates.json
 *
 * 2. JSON数据格式要求：
 *    {
 *      "酒店名称1": "模板文本，支持变量如${hotelName}、${roomNum}等",
 *      "酒店名称2": "另一个模板文本",
 *      // 更多酒店模板...
 *    }
 *
 *    注意：服务器返回的数据可以是：
 *    - 直接的JSON文本
 *    - Base64编码的JSON文本（支持中文内容，脚本会自动解码）
 *
 * 3. 可用变量：
 *    - ${hotelName}: 酒店名称
 *    - ${userName}: 入住人姓名
 *    - ${roomType}: 房型
 *    - ${mealType}: 餐型
 *    - ${startDate}: 入住日期
 *    - ${endDate}: 离店日期
 *    - ${roomNum}: 房间数
 *    - ${nightNum}: 晚数
 *    - ${channel}: 渠道
 *
 * 4. 本地降级方案：
 *    - 当外部URL无法访问或加载失败时，将自动使用内置的默认模板
 *    - 默认模板可在 getDefaultTemplates 函数中查看和修改
 *
 * 5. 调试信息：
 *    - 按F12打开开发者工具，在Console标签页中查看详细日志
 *    - 包括模板加载状态、处理进度和可能的错误信息
 ********************************************************************************/

// 外部模板URL - 用户可修改此URL以指向自定义的模板数据源
const TEMPLATES_URL = 'https://gitee.com/api/v5/repos/fuckv587/cf/contents/mt-dls/hotel.json?ref=master'; // Gitee API示例

// 定义酒店模板映射 - 修改为全局变量，允许从外部更新
let hotelTemplates = new Map();

// 创建一个自定义的提示框
const createSuccessMessage = () => {
    const successMessage = document.createElement('div');
    successMessage.id = "successMessage";
    successMessage.style.position = 'fixed';
    successMessage.style.top = '60px';
    successMessage.style.left = '50%';
    successMessage.style.transform = 'translateX(-50%)';
    successMessage.style.padding = '10px';
    successMessage.style.backgroundColor = 'rgb(125, 206, 125)';
    successMessage.style.color = 'white';
    successMessage.style.borderRadius = '5px';
    successMessage.style.zIndex = '99999';
    successMessage.style.display = 'none'; // 初始时不显示
    successMessage.innerText = '复制成功！';
    document.body.appendChild(successMessage);
    return successMessage;
};

// 获取默认酒店模板（降级方案）
function getDefaultTemplates() {
    console.log('使用默认模板作为降级方案');
    const templates = new Map();

    // 设置默认键值对（保留部分常用模板作为降级方案）
    templates.set('沁悦大酒店(常州湖塘纺织城店)', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum}  0');
    templates.set('常州环球港邮轮酒店', '${userName}  ${roomType}-${mealType} ${startDate}  ${roomNum}${nightNum}  晨风旅行社 房价0   房费预付，杂费自理，房价保密');
    templates.set('常州富都戴斯酒店', '店名 : 常州富都戴斯酒店</br>入离日期 :${startDate}至${endDate}共${nightNum}</br>客人姓名：${userName}</br>预订房型: ${roomType}房 ${mealType} ${roomNum}</br>结算价：0</br>来源：艺龙</br>备注：该客人房费已支付，本公司统一结算。房价保密，杂费自理。</br>发票：本公司开具。</br>烦请确认回复，谢谢');
    templates.set('常州远洲酒店', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum}  0');
    templates.set('南京国际会议大酒店', '客人：${userName}</br>入住：${startDate}</br>离店：${endDate}</br>房型：${roomType}</br>早餐：${mealType}</br>间数： ${roomNum}</br>金额：0</br>渠道：${channel}');
    templates.set('无锡鲁能万豪酒店', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum}  ');
    templates.set('茅山道温泉度假村', '预订信息</br>预订日期:${startDate}</br>预订业务员:美团合作</br>预订人:${userName}</br>预订房型:${roomType}</br>房间数量:${roomNum}${nightNum}</br>房费:0/间</br>备注:');
    templates.set('建德航空小镇君澜度假酒店', '酒店名 : 建德航空小镇君澜度假酒店</br>入离日期 : ${startDate}至 ${endDate}共${nightNum}</br>客人姓名 :${userName}  </br>预订房型 : ${roomType}+${mealType}  ${roomNum}</br>结算：200');
    templates.set('常州宝丽格大酒店', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum}  0');
    templates.set('苏州高新华美达酒店', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum}  苏州高新华美达酒店');
    templates.set('常州万泽酒店(武进春秋淹城店)', '${userName}   ${roomType}-${mealType} ${startDate}  ${roomNum}${nightNum}  0');
    templates.set('溧阳水西·酒店', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum} 0 ');
    templates.set('溧阳水西·天目湖酒店', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum} 0 ');
    templates.set('常州富都洲际酒店', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum}  0');
    templates.set('常州新城希尔顿酒店', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum} 常州新城希尔顿酒店');
    templates.set('常州福朋喜来登酒店', '${userName}  ${roomType} ${mealType}  ${startDate}  ${roomNum}${nightNum} 常州福朋喜来登酒店');

    return templates;
}

/**
 * 从外部URL获取酒店模板数据
 * @returns {Promise<Map<string, string>>} 包含各酒店预订信息模板的Map
 */
async function fetchTemplatesFromExternalUrl() {
    try {
        console.log('开始从外部URL获取模板数据...');

        /**********************************************************
         * 重要配置点！请修改以下URL为您的实际模板文件地址
         *
         * 推荐的外部数据源选项：
         * 1. Gitee：https://gitee.com/yourusername/repo/raw/main/hotel-templates.json
         * 2. GitHub Gist：https://gist.githubusercontent.com/yourusername/gist-id/raw/hotel-templates.json
         * 3. 其他支持CORS的JSON服务
         *
         * 请确保：
         * - URL可以公开访问
         * - 返回有效的JSON格式
         * - 服务器支持跨域访问(CORS)
         *
         * 如遇加载失败，脚本会自动使用内置默认模板
         **********************************************************/
        // 请修改这里的URL ↓↓↓
        const response = await fetch(TEMPLATES_URL, {
            timeout: 10000, // 设置10秒超时
            headers: {
                'Accept': 'application/json'
            }
        });

        if (!response.ok) {
            const errorMsg = `HTTP错误! 状态: ${response.status} ${response.statusText}`;
            console.error(errorMsg);
            showMessage(`模板加载失败: ${response.status}，使用默认模板`);
            throw new Error(errorMsg);
        }

        console.log('HTTP请求成功，开始处理响应数据...');

        // 首先获取原始响应文本
        const responseText = await response.text();
        console.log('获取到响应文本，长度:', responseText.length);

        let data;
        // 尝试base64解码方式（支持中文内容）
        try {
            // 使用decodeURIComponent(escape(atob()))解码base64编码的中文内容
            const responseObj = JSON.parse(responseText);
            const decodedContent = decodeURIComponent(escape(atob(responseObj.content)));
            console.log('base64解码成功，开始解析JSON...');
            data = JSON.parse(decodedContent);
        } catch (decodeError) {
            const errorMsg = '数据解码和解析失败，格式不正确';
            console.error(errorMsg, '解码错误:', decodeError.message);
            showMessage('模板数据解码失败，使用默认模板');
            throw new Error(errorMsg);
        }

        // 检查数据格式是否正确
        if (!data || typeof data !== 'object' || Array.isArray(data)) {
            const errorMsg = '获取的模板数据格式无效，应为JSON对象';
            console.error(errorMsg, '数据类型:', typeof data);
            showMessage('模板数据格式错误，使用默认模板');
            throw new Error(errorMsg);
        }

        console.log('数据解析成功，包含', Object.keys(data).length, '个模板项');

        const templates = new Map();
        const hotelNames = Object.keys(data);

        // 验证数据内容并转换为Map
        if (hotelNames.length === 0) {
            console.warn('获取的模板数据为空，使用默认模板');
            showMessage('模板数据为空，使用默认模板');
            return getDefaultTemplates();
        }

        hotelNames.forEach(hotelName => {
            const template = data[hotelName];
            // 验证模板格式
            if (typeof template === 'string' && template.includes('${')) {
                templates.set(hotelName, template);
            } else {
                console.warn(`忽略无效模板: ${hotelName}`);
            }
        });

        console.log(`成功获取并解析模板数据，共${templates.size}个有效模板`);

        // 如果有效模板数量很少，显示警告
        if (templates.size < 5) {
            console.warn(`模板数量较少: ${templates.size}个，可能数据不完整`);
            showMessage(`成功加载${templates.size}个模板`);
        } else {
            showMessage(`模板加载成功，共${templates.size}个`);
        }

        return templates;
    } catch (error) {
        console.error('从外部URL获取模板失败:', error);
        // 分类错误类型，提供更具体的错误信息
        if (error.name === 'AbortError' || error.message.includes('timeout')) {
            showMessage('模板加载超时，请检查网络连接');
        } else if (error.message.includes('Failed to fetch')) {
            showMessage('无法连接到模板服务器，请检查URL');
        } else {
            showMessage('模板加载失败，使用默认模板');
        }
        // 返回默认模板作为降级方案
        return getDefaultTemplates();
    }
}

/**
 * 初始化酒店模板Map对象
 * @returns {Promise<Map<string, string>>} 包含各酒店预订信息模板的Map
 */
async function initializeHotelTemplates() {
    try {
        console.log('初始化酒店模板...');

        // 记录开始时间用于性能监控
        const startTime = Date.now();

        // 从外部URL获取模板
        const templates = await fetchTemplatesFromExternalUrl();

        // 检查返回的模板
        if (!templates || !(templates instanceof Map)) {
            console.error('获取的模板不是有效的Map对象');
            showMessage('模板类型错误，使用默认模板');
            const defaultTemplates = getDefaultTemplates();
            hotelTemplates = defaultTemplates;
            return defaultTemplates;
        }

        if (templates.size === 0) {
            console.warn('未获取到有效模板，使用默认模板');
            showMessage('未找到有效模板，使用默认模板');
            const defaultTemplates = getDefaultTemplates();
            hotelTemplates = defaultTemplates;
            return defaultTemplates;
        }

        // 更新全局hotelTemplates变量
        hotelTemplates = templates;

        // 记录初始化完成和耗时
        const endTime = Date.now();
        console.log(`模板初始化完成，耗时: ${endTime - startTime}ms, 共${templates.size}个模板`);

        // 记录部分模板名称用于调试
        const templateNames = Array.from(templates.keys()).slice(0, 5).join(', ');
        if (templates.size > 5) {
            console.log(`部分模板名称: ${templateNames}...等${templates.size}个`);
        } else {
            console.log(`模板名称: ${templateNames}`);
        }

        return templates;
    } catch (error) {
        console.error('模板初始化异常:', error);
        showMessage('初始化模板时发生异常，使用默认模板');
        // 确保返回一个有效的Map对象
        const defaultTemplates = getDefaultTemplates();
        hotelTemplates = defaultTemplates;
        console.log(`使用默认模板，共${defaultTemplates.size}个`);
        return defaultTemplates;
    }
}

/**
 * 显示提示消息
 * @param {string} message - 要显示的消息内容
 * @param {number} duration - 消息显示持续时间（毫秒），默认2000
 */
function showMessage(message, duration = 2000) {
    const messageBox = document.getElementById('myMessageBox');
    if (messageBox) {
        messageBox.textContent = message;
        messageBox.style.display = 'block';

        // 使用setTimeout代替jQuery的fadeIn/fadeOut，减少依赖
        setTimeout(() => {
            messageBox.style.display = 'none';
        }, duration);
    } else {
        // 如果提示框不存在，创建一个新的
        const newMessageBox = document.createElement('div');
        newMessageBox.id = 'myMessageBox';

        // 设置样式
        Object.assign(newMessageBox.style, {
            position: 'fixed',
            top: '20px',
            left: '50%',
            transform: 'translateX(-50%)',
            backgroundColor: '#D3A053FF',
            color: 'white',
            padding: '10px 20px',
            borderRadius: '5px',
            fontSize: '16px',
            display: 'block',
            zIndex: '9999',
            fontWeight: 'bold',
            boxShadow: '0 2px 10px rgba(0, 0, 0, 0.3)'
        });

        newMessageBox.textContent = message;
        document.body.appendChild(newMessageBox);

        // 设置定时器隐藏
        setTimeout(() => {
            newMessageBox.style.display = 'none';
        }, duration);
    }
}

/**
 * 提取早餐信息
 * @param {string} str - 包含早餐信息的字符串
 * @returns {string} - 提取的早餐类型
 */
function extractBreakfast(str) {
    if (!str || typeof str !== 'string') {
        return '不含早';
    }

    // 匹配含双早、含单早或不含早
    const match = str.match(/(?<![不无])含(双|单)?早/);
    // const match = str.match(/含(双|单)?早/);

    if (match) {
        return match[0];
    }

    return '不含早';  // 默认返回不含早
}

/**
 * 提取房型信息
 * @param {string} inputString - 输入字符串
 * @returns {string} - 提取的房型
 */
function getRoomType(inputString) {
    if (!inputString || typeof inputString !== 'string') {
        return "";
    }

    // 匹配房型（如“豪华双人房”或“豪华大床间”）
    const roomRegex = /(.+?[房|间|屋][ABCDE]?)/;
    const roomMatch = inputString.match(roomRegex);

    if (roomMatch) {
        return roomMatch[1];
    }

    // 如果没有匹配到，返回第一个<符号前的内容
    return inputString.split('<')[0];
}

/**
 * 替换模板变量
 * @param {string} template - 模板字符串
 * @param {Object} data - 替换数据对象
 * @returns {string} - 替换后的字符串
 */
function replaceTemplateVariables(template, data) {
    return template.replace(/\$\{(\w+)\}/g, (match, key) => {
        return data[key] || '';
    });
}

/**
 * 处理订单行
 * @param {HTMLElement} row - 订单行元素
 * @param {HTMLElement} successMessage - 成功提示元素
 */
function processOrderRow(row, successMessage) {
    // 检查是否已经处理过
    if ($(row).find('.self-td').length > 0) {
        return;
    }

    try {
        // 提取酒店名称
        const firstTd = $(row).find('td:first');
        const hotelName = firstTd.find('.order-wrapper').find('div').eq(1).text().trim();

        // 如果没有找到酒店名称，跳过
        if (!hotelName) {
            return;
        }

        // 检查是否有对应的模板
        if (!hotelTemplates.has(hotelName)) {
            return;
        }

        // 提取房型信息
        const thirdTd = $(row).find('td').eq(1);
        const roomTypeStr = thirdTd.text();
        const roomTypeParts = roomTypeStr.split(' ');
        const roomType = roomTypeParts.length > 1 ? getRoomType(roomTypeParts[1]) : '';
        const mealType = extractBreakfast(roomTypeStr);
        const roomNum = $(thirdTd.find('.text-active')[0])?.text().trim() || '';

        // 提取日期信息
        const fourthTd = $(row).find('td').eq(2);
        const pList = fourthTd.find('p');
        let startDate = '', endDate = '', nightNum = '';

        if (pList.length >= 3) {
            startDate = $(pList[0]).text().split(' ')[1] || '';
            endDate = $(pList[1]).text().split(' ')[1] || '';
            nightNum = $(pList[2]).text() || '';
        }

        // 提取客人姓名
        const fifthTd = $(row).find('td').eq(3);
        const spanArr = fifthTd.find('.cursor-pointer');
        let userName = '';

        if (spanArr.length > 0) {
            userName = $(spanArr[0]).text().trim();
            if (userName.includes('成人')) {
                userName = spanArr.length > 1 ? $(spanArr[1]).text().trim() : '';
            }
        }

        // 准备替换数据
        const templateData = {
            name: hotelName,
            userName,
            roomType,
            mealType,
            startDate,
            endDate,
            roomNum,
            nightNum,
            channel: '艺龙' // 默认渠道
        };

        // 获取模板并替换变量
        const template = hotelTemplates.get(hotelName);
        const result = replaceTemplateVariables(template, templateData);

        // 添加隐藏的结果单元格
        $(row).append(`<td class="self-td" style="position:absolute;height:100px;overflow:auto;display:none">${result}</td>`);

        // 创建并添加复制按钮
        createCopyButton(row, result, successMessage);

    } catch (error) {
        console.error('处理订单行时出错:', error);
    }
}

/**
 * 创建复制按钮
 * @param {HTMLElement} row - 订单行元素
 * @param {string} content - 要复制的内容
 * @param {HTMLElement} successMessage - 成功提示元素
 */
function createCopyButton(row, content, successMessage) {
    // 创建并设置浮动的按钮
    const floatingBtn = $('<div class="floating-div">点击复制</div>');
    floatingBtn.css({
        backgroundColor: 'wheat',
        position: 'absolute',
        right: '150px',
        width: '65px',
        height: '18px',
        padding: '10px',
        marginTop: '40px',
        textAlign: 'center',
        zIndex: 9999,
        borderRadius: '5px',
        cursor: 'pointer',
        transition: 'background-color 0.3s ease'
    });

    // 添加悬停效果
    floatingBtn.on('mouseenter', function () {
        $(this).css('background-color', '#f0e68c');
    });

    floatingBtn.on('mouseleave', function () {
        $(this).css('background-color', 'wheat');
    });

    // 添加点击事件
    floatingBtn.on('click', function () {
        try {
            // 替换HTML换行符为实际换行符并复制到剪贴板
            navigator.clipboard.writeText(content.replace(/<\/br>/g, '\n'));

            // 显示复制成功的提示
            successMessage.style.display = 'block';

            // 1秒后隐藏提示
            setTimeout(function () {
                successMessage.style.display = 'none';
            }, 10);

        } catch (error) {
            console.error('复制失败:', error);
            // 如果剪贴板API失败，尝试降级方案
            fallbackCopyTextToClipboard(content.replace(/<\/br>/g, '\n'));
        }
    });

    // 将按钮添加到行中
    $(row).append(floatingBtn);
}

/**
 * 降级的复制文本到剪贴板方法
 * @param {string} text - 要复制的文本
 */
function fallbackCopyTextToClipboard(text) {
    const textArea = document.createElement('textarea');
    textArea.value = text;
    textArea.style.position = 'fixed';
    textArea.style.left = '-999999px';
    textArea.style.top = '-999999px';
    document.body.appendChild(textArea);
    textArea.focus();
    textArea.select();

    try {
        document.execCommand('copy');
        const successMessage = document.getElementById('successMessage');
        if (successMessage) {
            successMessage.style.display = 'block';
            setTimeout(() => {
                successMessage.style.display = 'none';
            }, 10);
        }
    } catch (error) {
        console.error('降级复制方法也失败了:', error);
    }

    document.body.removeChild(textArea);
}

/**
 * 主处理函数
 */
function processOrders() {
    // 确保hotelTemplates已初始化
    if (!hotelTemplates || hotelTemplates.size === 0) {
        console.warn('模板尚未初始化或为空，跳过处理');
        return;
    }

    const rows = $('.el-table__row');

    // 处理所有未处理的订单行
    rows.each(function (index, row) {
        const successMessage = document.getElementById('successMessage');
        processOrderRow(row, successMessage);
    });

    // 如果所有行都已处理，停止轮询
    if (rows.length > 0 && rows.length === rows.filter('.self-td').length) {
        clearInterval(window.orderProcessingInterval);
    }
}

// 页面加载完成后初始化
$(document).ready(async function () {
    // 创建成功提示元素
    const successMessage = createSuccessMessage();

    // 初始化模板
    await initializeHotelTemplates();

    // 设置轮询间隔为200毫秒（稍微延长以减少性能消耗）
    window.orderProcessingInterval = setInterval(processOrders, 200);

    // 添加页面卸载时清除定时器的逻辑
    window.addEventListener('beforeunload', function () {
        if (window.orderProcessingInterval) {
            clearInterval(window.orderProcessingInterval);
        }
    });
});
